<?  
  set_time_limit(4500);
  /* Se asegura que el archivo es incluido por el index */
    defined( 'LOAD_MODULE_ACTION' ) or die( 'No esta permitido el acceso directo a ' . __FILE__ );  
	/* Cuando se hace el include del archivo automaticamente crea un objeto y lo guarda en una variable temporal */
		$this->oTmpObject = new Relacion_exe( $this );
    
	class Relacion_exe extends Exe
	{
	function Relacion_exe( &$oModule )
		{
			$this->oModule = &$oModule;
      // Valida que el Entorno sea el Parametrico
        if ( ES_PARAMETRICO == false ) 
        {
          addMessage('Esta accion solo puede hacerse en el entorno parametrico');
          $this->oModule->back();    
        } 
		}
    
  // AGREGAR_RELACION:
  function insert ()
    {
      // Convierte a variables los datos del Formulario asociado a la accion
      $oForm = $this->oModule->loadClass( 'Relacion_frm' );
      extract( $oForm->getFieldArray() );
      // Busca la proxima clave
      $ncRelacion = $this->oModule->oDatabase->nextKey("stRelacion", "ncRelacion");
      // Agrega el registro
      $nRet = $this->oModule->oDatabase->insert("stRelacion", 
                      "ncClasePadre", $ncClasePadre,
                      "ncClaseHijo", $ncClaseHijo,
                      "ncTipoRelacionClase", $ncTipoRelacionClase,
                      "cdRelacion", $cdRelacion,
                      "cFisico", $cFisico, 
                      "ncRelacion", $ncRelacion);
      if ( $nRet == false ) 
      {
        addMessage("No se pudo dar de alta una relacion");
      } elseif ( $ncTipoRelacionClase <= 3 ) { // Solo si son Relaciones de Base de Datos
        // Pone el Tipo de Atributo de Acuerdo al ncTipoRelacionClase
        // 1. Identifying Clase             => 1. Clave
        // 2. Non Identifying No Nulls 	 => 2. Obligatorio
        // 3. Non Identifying Null Allowed => 3.Optativo           
        $ncTipoAtributo = $ncTipoRelacionClase;
        $cSql = "SELECT ncAtributo, cdAtributo, cFisico, cdClaseAtributo, fLongitud
                    FROM stClaseAtributo
                    WHERE ncClase = $ncClasePadre
                        AND ncTipoAtributo = 1 ";
        $this->oModule->oDatabase->query($cSql);
        $ncOrden = 0;           
        while ( $this->oModule->oDatabase->moveNext() ) 
        {
          // Verifica primero si no existe el campo                
          $ncAtributoExistente = $this->oModule->oDatabase->getData("SELECT ncAtributo FROM stClaseAtributo WHERE ncClase=$ncClaseHijo and cFisico = '" . $this->oModule->oDatabase->aFields["cFisico"] . "'" );
          if ( $ncAtributoExistente ) 
          {
            $ncAtributoHijo = $ncAtributoExistente;
          } 
          else 
          {
            // Busca cual es el ultimo numero de Atributo de la Clase Hijo
            $ncAtributoHijo = $this->oModule->oDatabase->nextKey("stClaseAtributo", "ncAtributo", "ncClase=$ncClaseHijo" );
              
            $nRet1 = $this->oModule->oDatabase->insert("stClaseAtributo", 
                                "cFisico", $this->oModule->oDatabase->aFields["cFisico"], 
                                "cdAtributo", $this->oModule->oDatabase->aFields["cdAtributo"], 
                                "cdClaseAtributo", $this->oModule->oDatabase->aFields["cdClaseAtributo"], 
                                "fLongitud", $this->oModule->oDatabase->aFields["fLongitud"], 
                                "ncTipoAtributo", $ncTipoAtributo,
                                "ncClase", $ncClaseHijo,
                                "ncAtributo", $ncAtributoHijo );
            if ( $nRet1 == false ) 
            {
              addMessage("No se pudo agregar un campo nuevo a la tabla");
            } 
          }
          $nRet2 = $this->oModule->oDatabase->insert("stRelacionAtributo", 
                  "ncRelacion", $ncRelacion, 
                  "ncOrden", $ncOrden,
                  "ncAtributoPadre", $this->oModule->oDatabase->aFields["ncAtributo"], 
                  "ncAtributoHijo", $ncAtributoHijo );
          if ( $nRet2 == false ) 
          {
            addMessage("No se pudo agregar el detalle de atributo de la relacion");
          }
          $ncOrden++;
			}
		}
		$oForm->reset();
	}
	// ASIGNAR_ORDENES_A_LAS_CLASES:
	function order ()
	{
		asignarOrden( 101 );
	}
	// ELIMINAR_RELACION:
	function delete()
	{
		// Obtiene los Parametros
		$ncRelacion = getParam("Relacion" );
		// Elimina los atributos de la relacion
		$this->oModule->oDatabase->delete("stRelacionAtributo", "ncRelacion", $ncRelacion );
		// Elimina la Relacion
		$this->oModule->oDatabase->delete("stRelacion", "ncRelacion", $ncRelacion );
	}
	}
?>
